package com.itbaizhan.filter;

import javax.servlet.*;
import java.io.IOException;

/*设置请求编码  将编码写在web.xml里的 <init-param> ，这样可以修改编码*/
/*FilterConfig对象的使用
FilterConfig对象是用来读取中初始化参数的对象。该对象通过参数
传递到init方法中，用于读取初始化参数。

filterConfig.getInitParameter("name")
通过name获取对应的value。

filterConfig.getInitParameterNames()
返回该Filter中所有中的值*/
/*当启动其他的servlet时（例：GetRequestDataServlet.java） ,Filter会在启动请求时，Filter会自动去拦截请求进行过虑，所以不用专门去启动Filter*/
public class EncodingFilter implements Filter {
    //设置默认编码  这里的成员变量是设置好的，不是会变的，所以安全性问题不大
    private String defaultEncode = "utf-8";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String encode = filterConfig.getInitParameter("encode");
        //如果获得的编码不是空的与有长度的，则使用这编码，否则使用默认编码
        if(encode !=null && encode.length()>0){
            this.defaultEncode = encode;
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //设置请求编码
        servletRequest.setCharacterEncoding(this.defaultEncode);
        //一般情况下不要设置响应编码，因为响应的是什么是根据业务内容决定，可能是图片（二进制响应），
        //所以设置响应编码应该在servlet设置
        // 响应编码应放在讲求过虑前，如果放在请求过虑后，会无效，因为对响应
        // 内容进行压缩，产生响应，是在请求过虑前，请求过虑后就发送给客户端浏览器
        //servletResponse.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}
